﻿/* cpcPaChi;

   Un compilador de Pascal chiquitito para CPC
   Por Nacho Cabanes - Version en C#

   Versiones hasta la fecha:

   Num.    Fecha       Cambios
   ---------------------------------------------------
   0.06cs  29-Oct-2010  El fichero de salida toma su nombre del fichero
                        de entrada.

   0.05cs  27-Oct-2010  Primera version del analizador sintactico,
                        extraido del programa principal (clase "Parser").
                        
   0.04cs  25-Oct-2008  Primera version con generador de codigo
                        independiente (en la clase "CodeGen")
                      
   0.03cs  22-Oct-2010  Creado un analizador lexico independiente
                        (en la clase "Lexer")

   0.02cs  18-Oct-2010  Admite CLS, LOCATE, WRITECHAR,
                        que lee desde fichero. Solo permite
                        una orden en cada linea, con formato fijo

   0.01cs  15-Oct-2010  Preliminar: solo acepta CLS por teclado
                        y genera el codigo correspondiente
*/

using System;
using System.IO;

class cpcpachi
{
  static string nombreOrigen;
  static Scanner miLexer;       // El analizador léxico
  static Parser miParser;     // El analizador sintáctico
  static CodeGen miGenerador; // El generador de código
  static TablaSimbolos miTablaSimb; // La tabla de símbolos


  /* Analiza las opciones que teclee el usuario. Por ahora,
  solo el nombre del fichero a compilar */
  static void analizarOpciones(string[] opciones)
  {
    if (opciones.Length == 0)
    {
      Console.WriteLine(
        "No se ha indicado el nombre del fichero");
      Environment.Exit(1);
    }

    nombreOrigen = opciones[0];
    miLexer = new Scanner(nombreOrigen);
    // Creo el nombre de destino cambiando .pas por .bas
    string nombreDestino = nombreOrigen;
    if (nombreDestino.IndexOf(".") > 0)
      nombreDestino = nombreDestino.Remove (nombreDestino.IndexOf(".") );
    nombreDestino += ".bas";
    miTablaSimb = new TablaSimbolos();
    miGenerador = new CodeGen( nombreDestino, miTablaSimb, miLexer );
    miParser = new Parser( miLexer, miGenerador, miTablaSimb );
  }



  /* Cuerpo del programa */
  static void Main(string[] opciones)
  {
    analizarOpciones(opciones); 
    
    // Analisis sintatico de toda la estructura del programa
    miParser.AnalizarPrograma();
    
    // Genera el codigo de destino final: cargador Basic
    miGenerador.genCodigoFinal();
  }
}
